function isObject(obj) {
  return typeof obj === "object" && obj !== null;
}

// 深拷贝
export const jsonParseStringfy = (value) => {
  let _data = JSON.stringify(value),
    dataChange = JSON.parse(_data);
  return dataChange;
};
export const deepClone = (source) => {
  if (!isObject(source)) return source;
  const target = Array.isArray(source) ? [] : {};
  for (const key in source) {
    if (Object.prototype.hasOwnProperty.call(source, key)) {
      target[key] = deepClone(source[key]);
    }
  }
  return target;
};

// 本地存储
const localName = "SST-";
export const localSet = (key, value) => {
  window.localStorage.setItem(localName + key, JSON.stringify(value));
};
export const localGet = (key) => {
  const value = window.localStorage.getItem(localName + key);
  try {
    return JSON.parse(window.localStorage.getItem(localName + key));
  } catch (error) {
    console.log('error',error)
    return value;
  }
};



export const localRemove = (key) => {
  window.localStorage.removeItem(localName + key);
};

/**
 * 清除所有缓存
 */
export const localRemoveAll = () => {
  window.localStorage.clear();
};

/**
 * 数组对象按某一属性值进行排序
 * @param prop - 数组对象的某一属性
 */
export const sortCompare = (prop) => {
  return function (obj1, obj2) {
    let val1 = obj1[prop];
    let val2 = obj2[prop];
    if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
      val1 = Number(val1);
      val2 = Number(val2);
    }
    if (val1 < val2) {
      return -1;
    } else if (val1 > val2) {
      return 1;
    } else {
      return 0;
    }
  };
};

/**
 * input输入框的输入限制，类型必须是text
 * @param value  -  输入框传输的值；
 * @param {Number} before -  指定小数点前面的位数；
 * @param {Number} after  -  指定小数点后面的位数；
 * @param {Boolean} state  -  是否可以输入小数点, 默认为 true - 可以输入小数点； false - 不能输入小数点。
 * @returns {Number}
 */
export const limitInputNum = (value, before, after, state = true) => {
  value = value.replace("。", ".");
  let newBefore = parseFloat(before);
  let newAfter = parseFloat(after);
  value = value.replace(/[^ \d.]|\s|^\./g, "");
  value = value.replace(/^0{2,}/g, "0");
  if (state) {
    value = value.replace(/\.{2,}/g, ".");
  } else {
    value = value.replace(/\./g, "");
  }
  value = value.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
  if (value.indexOf(".") >= 0) {
    value =
      value.split(".")[0].slice(0, newBefore) +
      "." +
      value.split(".")[1].slice(0, newAfter);
  } else {
    value = value.slice(0, newBefore);
  }
  return value;
};

/**
 * input输入框的输入限制,类型必须是text。@blur事件之后检查是否一个int类型 配合limitInputNum()使用
 * @param value  -  输入框传输的值；
 * @returns {Number}
 */
export const filterInputNum = (value) => {
  if (value.length !== 0 && value.split('.')[value.split('.').length - 1] === '') {
    return value.split('.')[0];
  }
  return value;
};

/**
 * 数字单位处理:大于4位显示'万'；大于8位，显示'亿'
 * @param {String | Number} val  -  传入的值；
 * @param {Number} fixNum -  保留小数点后几数；
 * @returns {String} 格式，如：120&、7.52&万、2.00&亿
 */
export const numToFixed = (val, fixNum = 0) => {
  if (val === "--") return val;
  let valStr = val + "";
  let valNum = Number(val);
  if (valStr.split(".")[1]) {
    // 传入小数
    if (valStr.split(".")[0].length > 4 && valStr.split(".")[0].length <= 8) {
      // 万
      return (valNum / 10000).toFixed(fixNum) + "&万";
    }
    if (valStr.split(".")[0].length > 8) {
      // 亿
      return (valNum / 100000000).toFixed(fixNum) + "&亿";
    }
  } else {
    // 传入整数
    if (valStr.length > 4 && valStr.length <= 8) {
      return (valNum / 10000).toFixed(fixNum) + "&万";
    }
    if (valStr.length > 8) {
      return (valNum / 100000000).toFixed(fixNum) + "&亿";
    }
  }
  return valNum.toFixed(fixNum) + "&";
};

// 下载相关
export const downloadFile = (address, name) => {
  const a = document.createElement("a");
  // 文件地址
  a.href = address;
  a.download = name;
  a.click();
  a.remove();
};


/**
 * 图片下载
 * @param imgSrc
 * @param name
 */
export const downloadImage = (imgSrc, name) => {
  //下载图片地址和图片名
  let image = new Image();
  // 解决跨域 Canvas 污染问题
  image.setAttribute("crossOrigin", "anonymous");
  image.onload = function() {
    let canvas = document.createElement("canvas");
    canvas.width = image.width;
    canvas.height = image.height;
    let context = canvas.getContext("2d");
    context.drawImage(image, 0, 0, image.width, image.height);
    let url = canvas.toDataURL("image/png"); //得到图片的base64编码数据'
    let a = document.createElement("a"); // 生成一个a元素
    let event = new MouseEvent("click", {
      bubbles: true,
      cancelable: true,
      view: window
    }); // 创建一个单击事件
    a.download = name || "photo"; // 设置图片名称
    a.href = url; // 将生成的URL设置为a.href属性
    a.dispatchEvent(event); // 触发a的单击事件
  };
  image.src = imgSrc;
};

/**
 2  * [通过参数名获取url中的参数值]
 3  * 示例URL:http://htmlJsTest/getrequest.html?uid=admin&rid=1&fid=2&name=小明
 4  * @param  {[string]} queryName [参数名]
 5  * @return {[string]}           [参数值]
 6  */
export const GetQueryValue = (queryName) => {
  let query = decodeURI(window.location.search.substring(1));
  let vars = query.split("&");
  for (let i = 0; i < vars.length; i++) {
    let pair = vars[i].split("=");
    if (pair[0] == queryName) {
      return pair[1];
    }
  }
  return null;
}

import { ElMessage } from "element-plus";
// 表单错误信息提示
export const validateTip = (fields) => {
  for (let key in fields) {
    ElMessage.warning(fields[key][0].message);
  }
}

// 验证用户输入是否是空字符串
export const checkEmptyString = (rule, value, callback) => {
  if (value.trim()==='') {
    callback(new Error('输入内容不能为空字符串!'));
  } else {
    callback()
  }
}

// 重置表单
export const resetForm = (form) => {
  for (let key in form) {
    if (form[key] instanceof Array || Array.isArray(form[key])) {
      form[key] = [];
    }
    if (typeof form[key] === 'string') {
      form[key] = '';
    }
    if (typeof form[key] === 'number') {
      form[key] = 0;
    }
    if (typeof form[key] === null) {
      form[key] = '';
    }
  }
  return JSON.parse(JSON.stringify(form));
}


/**
* @description:计算两个日期相差
* @param {startTime} 开始日期
* @param {endTime} 结束日期
* @param {diffType} 比较类型 天,时,分,秒
* @return: 相差
*/
export const GetDateDiff = (startTime, endTime, diffType = 'day') => {
  if (startTime && endTime) {
    //将xxxx-xx-xx的时间格式，转换为 xxxx/xx/xx的格式
    startTime = startTime.replace(/\-/g, "/");
    endTime = endTime.replace(/\-/g, "/");
    //将计算间隔类性字符转换为小写
    diffType = diffType.toLowerCase();
    // var sTime = new Date(startTime); //开始时间
    // var eTime = new Date(endTime); //结束时间
    var sTime = new Date(startTime); //开始时间
    var eTime = new Date(endTime); //结束时间

    if (sTime > eTime) {
      alert("开始时间不能大于结束时间!!!");
      return false;
    }
    //作为除数的数字
    var divNum = 1;
    switch (diffType) {
      case "second":
        divNum = 1000;
        break;
      case "minute":
        divNum = 1000 * 60;
        break;
      case "hour":
        divNum = 1000 * 3600;
        break;
      case "day":
        divNum = 1000 * 3600 * 24;
        break;
      default:
        break;
    }
    return parseInt((eTime.getTime() - sTime.getTime()) / parseInt(divNum));
  } else {
    console.log('-----------');
    return '0'
  }
}


export const getDiffDay = (date1, date2) => {
  if (!date1 || !date2) {
    return 0;
  }

  var startDate = Date.parse(date1);
  var endDate = Date.parse(date2);
  if (startDate > endDate) {
    return 0;
  }
  if (startDate == endDate) {
    return 1;
  }
  var days = (endDate - startDate) / (1 * 24 * 60 * 60 * 1000);
  if (days < 1 && days > 0) {
    return 1;
  }

  return Math.ceil(days);
}

/**
 * 给一个二进制流文件导出一个excel文件
 * @param res 二进制流文件
 * @param name 导出的excel表名称
 * @return 导出的excel文件
 */
export const exportExcelFile = (res, name = new Date().getTime().toString()) => {
  let blob = new Blob([res.data], {
    type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8",
  });
  let objectUrl = URL.createObjectURL(blob);
  let a = document.createElement("a");
  a.href = objectUrl;
  a.download = `${name}.xlsx`;
  a.click();
  URL.revokeObjectURL(a.href)
  a.remove()
}

/**
 * 给一个二进制文件流导出(下载)一个文件
 * @param res 二进制文件流
 * @param name 导出(下载)的文件名称
 * @param fileType 导出(下载)的文件格式
 * @param blobType 二进制文件流的格式
 */
export const exportFile = (res, name, fileType = 'xlsx', blobType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8') => {
  let blob = new Blob([res], {
    type: blobType,
  });
  let objectUrl = URL.createObjectURL(blob);
  let a = document.createElement("a");
  a.href = objectUrl;
  a.download = `${name}.${fileType}`;
  a.click();
  URL.revokeObjectURL(a.href)
  a.remove()
}


/**
 * 给一个二进制流文件导出一个excel文件
 * @param res 二进制流文件
 * @param name 导出的excel表名称
 * @return 导出的excel文件
 */
export const exportExcelFilexls = (res, name = new Date().getTime().toString()) => {
  let blob = new Blob([res], {
    type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8",
  });
  let objectUrl = URL.createObjectURL(blob);
  let a = document.createElement("a");
  a.href = objectUrl;
  a.download = `${name}.xls`;
  a.click();
  URL.revokeObjectURL(a.href)
  a.remove()
}


/**
 * 给指定参数,调用后端接口
 * @param fileName 文件名,放到那个文件里面的js文件名称
 * @param apiPath 调用的接口路径
 * @param param 接口接受的参数
 *
 */
export const getInterface = async (fileName, apiPath, param) => {
  let interfaces = import(`@/api/${fileName}.js`);
  let pathArr = apiPath.split('.');
  const result = await interfaces;
  return result[pathArr[0]][pathArr[1]](param);
};


//获取url参数(非hash模式)
export const getURLhandler = (url = '/constructionProjectManage/project_mt/components/projectInfo/type=1&id=1') => {
  let list = url.split('/')
  let strs = list[list.length - 1].split('&');
  // console.log(strs);
  let obj = {}
  strs.map(item => {
    let arr = item.split('=')
    obj[arr[0]] = arr[1]
  })
  return obj
}

/**
 * 将blob转为file
 *
 * @param blob
 * @param filename
 * @param type
 * @return {File}
 */
export function blobToFile(blob, filename, type) {
  return new File([blob], filename, { type })
}

/**
 * 计算日期之间的天数
 * 案例: let a = computer_days(1677463636960, 1678068436960)
 * 案例: let a = computer_days(new Date('2023-02-27'), new Date('2023-03-06'))
 * @param start
 * @param end
 * @return {number}
 */
export const computer_days = (start, end) => Math.ceil(Math.abs(start-end)  / 86400000);
